const express = require("express");
const morgan = require("morgan");
const router = require("./router");
const errorhandler = require("errorhandler");
const path = require("path");
const session = require("express-session");
const MongoStore = require("connect-mongo")(session);
const mongoose = require("mongoose");
const { sessionSecret } = require("./config/config.default");

const app = express();

/**
 *  配置使用 session 中间件
 *    存储 Session： 1. 生成Session ID 2. 存储数据
 *       req.session.xxx = yyy
 *    获取 Session   1. 根据 Session ID 获取 Session 容器中的数据
 *       const sessionData = req.session.xxx
 *    主语： 默认数据存储到内存中
 * */
app.use(
  session({
    secret: sessionSecret, // 签发 Session ID 的密钥
    resave: false, // 是否每次都重新保存 Session，默认 false
    saveUninitialized: true, // 是否自动保存未初始化的 Session，默认 true
    cookie: {
      maxAge: 24 * 60 * 60 * 1000, // Session 的有效期，单位是毫秒
      httpOnly: true, // 是否只允许 HTTP 请求访问 Cookie，默认 true
      secure: false, // 是否只允许 HTTPS 请求访问 Cookie，默认 false
    },
    store: new MongoStore({
      mongooseConnection: mongoose.connection, // 连接到 MongoDB
    }),
  })
);
require("./model");

app.use((req, res, next) => {
  app.locals.sessionUser = req.session.user;
  next();
});

app.engine("html", require("express-art-template")); // 使用 .art 后缀的文件的时候使用 express-art-template 模板引擎
app.set("view options", {
  // art-template 配置项
  debug: process.env.NODE_ENV !== "production",
});
app.set("views", path.join(__dirname, "views")); // 设置模板文件目录
app.set("view engine", "html"); // 可以省略的模块文件后缀名

app.use("/public", express.static(path.join(__dirname, "./public")));
app.use(
  "/node_modules",
  express.static(path.join(__dirname, "./node_modules"))
);

app.use(morgan("dev"));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.use(router);
if (process.env.NODE_ENV === "development") {
  app.use(errorhandler());
}

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});
